from rest_framework import serializers

#序列化器
from api.models import Employee


class EmpSerializer(serializers.Serializer):

    """
    需要和model同等的名字和数据,要序列哪个就写哪个,但是变量名必须相同
    """

    name=serializers.CharField()
    password=serializers.CharField()
    # gender=serializers.IntegerField()
    phone=serializers.CharField()
    pic=serializers.ImageField()

    gender=serializers.SerializerMethodField()
    def get_gender(self,obj):
        return obj.get_gender_display()

#反序列化器
class DeEmpSerializer(serializers.Serializer):
    """
    反序列化"将前台的数据保存入库,入库之前需要做如下判断
        1.前台需要提供的字段
        2,对字段进行安全校验
        3,哪些字段需要额外的校验
    """
    name = serializers.CharField(

    )
    password = serializers.CharField(
        max_length=6,
        min_length=2,
        #下面是提示信息,但是会覆盖掉原来的精确的信息,所以在填写的时候一定要自己写精确点
        error_messages={
            "max_length":"长度太长了,不能超过8个字符",
            "min_length":"长度太短了,不能小于2个字符"
        }
    )
    #想要完成新增员工,必须重写create()方法
    def create(self,validated_data):
        print(validated_data)
        return Employee.objects.create(**validated_data)

#ModelSerializer的方法
class ModelSer(serializers.ModelSerializer):
    class Meta:
        #1,制定当前序列化器要序列化的模型
        model=Employee
        #2,制定你要序列化模型的字符安
        # fields=('name',"password","gender","phone")

        #查看所有字段
        fields="__all__"

        # 指定不展示哪些字段
        #exclude=("","")

        #指定查询深度,关联对象的查询,可以查询出有外键关心的信息
        #depth=1(或者2,或者3)

class DeModelSer(serializers.ModelSerializer):
    class Meta:
        model=Employee
        fields="__all__"

#群修改ListSerializer
class day_ListSerializer(serializers.ListSerializer):
    def update(self,instance,validated_data):
        #self  当前调用的序列器类
        #instance 要修改的对象
        #validated_data 要修改的数据
        #群改遍历,一次修改一个
        for index,obj in enumerate(instance):
            #此时child必须要
            self.child.update(obj,validated_data[index])
        return instance
